/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package sadfinanceiro.calculos;

import java.math.BigDecimal;
import java.math.RoundingMode;
import sadfinanceiro.model.Investimento;

/**
 *
 * @author Felipe
 */
public class Calculador {

    private static final BigDecimal CEM = new BigDecimal(100);

    /**
     * Este método analisa todos as variáveis do investimento e completa o mesmo com o que está faltando
     * @param investimento
     * @throws java.lang.Exception
     */
    public static void calcula(Investimento investimento) throws Exception {
        if (investimento.isInvestimentoValido()) {
            if (investimento.getValorFuturo()==null) {
                calculaValorFuturo(investimento);
            }else if (investimento.getPeriodoAplicacao()==null) {
                calculaPrazo(investimento);
            }else if (investimento.getRentabilidade()==null) {
                calculaRentabilidade(investimento);
            }else if (investimento.getCapitalInicial()==null) {
                calculaCapitalInicial(investimento);
            }else if (investimento.getValorReforco()==null) {
                calculaReforcoMensal(investimento);
            }
        }else {
            throw new Exception("Dados Mal Informados");
        }
        
    }

    private static void calculaValorFuturo(Investimento investimento) {
        BigDecimal valorFuturo = investimento.getCapitalInicial();
        BigDecimal rentabilidade = investimento.getRentabilidade().divide(new BigDecimal(100)).add(BigDecimal.ONE);
        BigDecimal valorReforco = investimento.getValorReforco();
        for (int i=0; i<investimento.getPeriodoAplicacao(); i++) {
            valorFuturo = valorFuturo.add(valorReforco);
            valorFuturo = valorFuturo.multiply(rentabilidade);
        }
        investimento.setValorFuturo(valorFuturo);
    }

    private static void calculaReforcoMensal(Investimento investimento) {
        investimento.setValorReforco(BigDecimal.ZERO);
    }

    private static void calculaPrazo(Investimento investimento) {
        BigDecimal capitalInicial = investimento.getCapitalInicial();
        BigDecimal rentabilidade = investimento.getRentabilidade().divide(new BigDecimal(100)).add(BigDecimal.ONE);
        BigDecimal valorReforco = investimento.getValorReforco();
        BigDecimal valorFuturo = investimento.getValorFuturo();
        BigDecimal aux = capitalInicial;
        int prazo = 0;
        while(valorFuturo.compareTo(aux)>0) {
            aux = aux.add(valorReforco);
            aux = aux.multiply(rentabilidade);
            prazo++;
        }
        investimento.setValorFuturo(aux);
        investimento.setPeriodoAplicacao(prazo);
    }

    private static void calculaRentabilidade(Investimento investimento) {
        BigDecimal valorFuturo = investimento.getValorFuturo();
        BigDecimal capitalInicial = investimento.getCapitalInicial();
        BigDecimal prazo = new BigDecimal(investimento.getPeriodoAplicacao());
        
        BigDecimal nJuros = valorFuturo.divide(capitalInicial);
        BigDecimal nTotal = BigDecimal.ONE.divide(prazo, 10, RoundingMode.DOWN);
        nJuros = new BigDecimal(Math.pow(nJuros.doubleValue(),nTotal.doubleValue()));
        nTotal = nJuros.subtract(BigDecimal.ONE);
        nTotal = nTotal.multiply(CEM);
        investimento.setRentabilidade(nTotal);
    }

    private static void calculaCapitalInicial(Investimento investimento) {
        BigDecimal valorFuturo = investimento.getValorFuturo();
        BigDecimal capitalInicial = investimento.getCapitalInicial();
        BigDecimal prazo = new BigDecimal(investimento.getPeriodoAplicacao());
        BigDecimal taxaJuros = investimento.getRentabilidade().divide(new BigDecimal(100)).add(BigDecimal.ONE);

    	BigDecimal nJuros = new BigDecimal(Math.pow(taxaJuros.doubleValue(),prazo.doubleValue()));
        capitalInicial = valorFuturo.divide(nJuros,2,RoundingMode.DOWN);
/*        BigDecimal aux = BigDecimal.ZERO;
        for (int i=0;i<investimento.getPeriodoAplicacao();i++) {
            aux = aux.add(capitalInicial.divide(prazo));
        }*/
        investimento.setCapitalInicial(capitalInicial);
    }

    public static void main(String[] args) throws Exception {
        Investimento investimento = new Investimento();
        investimento.setValorReforco(BigDecimal.ZERO);
        investimento.setValorFuturo(new BigDecimal(1000));
        investimento.setPeriodoAplicacao(12);
        investimento.setRentabilidade(BigDecimal.ONE);
        calcula(investimento);

        System.out.println("inicial: "+investimento.getCapitalInicial());
    }
}
